<?php

/*
  *  项目初始化类
  */

class Frame{
    //项目入口方法

    public static function run(){
       
        //定义目录常量
        static::initContr();

        //初始化配置
        static::initConfig();

        //请求分发参数
        static::initDispatchparam();

        //定义平台常量目录
        static::initPlatformConst();
        //自动加载方法
        static::initAutoload();
        
        //调用模板方法
        static::initDispatch();
    }
        //根目录常量
        private static function initContr (){
            //定义目录常量
            //根目录常量
            define('ROOT_DIR',str_replace('\\','/',getcwd().'/'));
            //应用程序目录常量
            define('APP_DIR',ROOT_DIR.'App/');
            //定义基础模板目录常量
            define('FRAME_DIR',ROOT_DIR.'Frame/');
            //定义配置文件目录常量
            define('CONFIG_DIR',APP_DIR.'Config/');
            //定义bases文件目录常量
            define('BASES_DIR',FRAME_DIR.'bases/');
        

        }

        //确认分发参数
        private static function initDispatchparam (){
            //确认分发平台参数p
            //$define_platform = 'Test'; //默认
            define('PLATFORM',$p=isset($_GET['p'])?$_GET['p']:$GLOBALS['config']['App']['define_platform']);

            //确认分发参数C控制器
            $default_controller = 'news';//默认
            @define('CONTROLLER',$c = isset($_GET['c'])?$_GET['c']:$GLOBALS['config'][PLATFORM]['define_controoler']);

            //确认分发参数a
            $default_action = 'list';//默认
            define('ACTION',$a = isset($_GET['a'])?$_GET['a']:$GLOBALS['config'][PLATFORM]['define_action']);       
        }

        //自动加载方法
        private static function autoload ($class_name){
        
            $frame_class_list = array(
            // 键值 =>  值
            // 类名 =>  类文件地址
            'Controller' =>FRAME_DIR.'Controller.class.php',     //基础控制器类
            'Model' => FRAME_DIR.'Model.class.php',                  //基础模板类
            'Factory' =>FRAME_DIR.'Factory.class.php',
            'MySQLDB' =>BASES_DIR.'MySQLDB.class.php'
            );
            //先判断是否是核心
            // echo $frame_class_list[$class_name]."<br/>";
            if(isset($frame_class_list[$class_name])){
            //如果是就引入类
            include $frame_class_list[$class_name];
            } elseif (substr($class_name,-10) == 'Controller'){
            //在判断是不是控制器类 能进来就说明是控制器类
            include CURRENT_CONTR_DIR.$class_name. '.class.php';
            } elseif (substr($class_name,-5) == 'Model') {
            //在判断是不是模板类 能进来就说明是模板类
            include CURRENT_MODEL_DIR .$class_name. '.class.php';
            }           
        }

        //定义平台相关目录
        private static function initPlatformConst (){
            //定义当前平台下的控制器，模板，视图目录
            //定义当前控制器类目录
            define('CURRENT_CONTR_DIR',APP_DIR.PLATFORM.'/Controller/');
            //定义当前模板类目录
            define('CURRENT_MODEL_DIR',APP_DIR.PLATFORM.'/Model/');
            //定义当前视图目录
            define('CURRENT_VIEW_DIR',APP_DIR.PLATFORM.'/View/');
        }
            
        //注册自动加载方法
        private static function initAutoload (){
            spl_autoload_register(array(__CLASS__,'autoload'));
        }

        //请求分发
        private static function initDispatch (){
            $controller_auto=  CONTROLLER.'Controller';
            $controller = new $controller_auto;

            $action_name=ACTION.'Action'; //加载动作
            $controller->$action_name();
        }

        //初始化配置
        //执行这个方法$GLOBALS['conf'] 就会在全局数据区开辟一个空间来装这个变量 此时这个变量在方法中或是在其他地方都可以访问  此时性质已经和常量差不多了
        private static function initConfig (){
            //返回的是一个叫conf 的数组 但是要访问这个数据就要加上$GLOBAlS 访问全局数据区
            //要想直接访问变量的值就要使用到$GLOBALS
            //要想在方法外访问方法内变量的只就必须把变量存储在$GLOBALS的全局数据区中
            $GLOBALS['config'] = include CONFIG_DIR.'Config.php';
        }


}